#pragma once 

typedef int DataType;

//写一个与int Less(DataType left, DataType right); 一样类型的函数指针，指向它
//即：int (*PCOM)(DataType left, DataType right) 
//一般情况下 typedef是这样写的 typedef int(*)(DataType left, DataType right) PCOM 
//但是函数指针比较特殊，不这样写，用下面的方式写
typedef int(*PCOM)(DataType left, DataType right); // 函数指针的别名为 PCOM 

typedef struct Heap
{
    DataType* array;
    int capacity;
    int size;
    PCOM pCom;  //函数指针变量 --- 指向所有比较函数
}Heap;

//小堆
int Less(DataType left, DataType right);
//大堆
int Greater(DataType left, DataType right);

//初始化
void HeapInit(Heap* hp, DataType* array, int size, PCOM pCom);

//插入
void HeapInsert(Heap* hp, DataType data);

//删除
void HeapErase(Heap* hp);

//获取堆顶元素
DataType HeapTop(Heap* hp);

//判空
int HeapEmpty(Heap* hp);

//获得有效元素的大小
int HeapSize(Heap* hp);

//销毁
void HeapDestroy(Heap* hp);


